 1.推测执行
   
   集群规模很大时(几百上千台节点的集群），个别机器出现软硬件故障的概率就变大了，并且会因此
延长整个任务的执行时间推测执行通过将一个task分给多台机器跑，取先运行完的那个，会很好的解决
这个问题。对于小集群，可以将这个功能关闭。
   mapreduce.map.speculative true
   mapreduce.reduce.speculative true
   建议:
   大型集群建议开启，小集群建议关闭！
   集群的推测执行都是关闭的。在需要推测执行的作业执行的时候开启
 
 2.Slow Start
   
   MapReduce的AM在申请资源的时候，会一次性申请所有的Map资源，延后申请reduce的资源，这
样就能达到先执行完大部分Map再执行Reduce的目的。
   mapreduce.job.reduce.slowstart.completedmaps
   当多少占比的Map执行完后开始执行Reduce。默认5%的Map跑完后开始起Reduce。
   如果想要Map完全结束后执行Reduce调整该值为1
 
 3.小文件优化
   
   HDFS：hadoop的存储每个文件都会在NameNode上记录元数据，如果同样大小的文件，文件很
小的话，就会产生很多文件，造成NameNode的压力。
   MR：Mapreduce中一个map默认处理一个分片或者一个小文件，如果map的启动时间都比数据
处理的时间还要长，那么就会造成性能低，而且在map端溢写磁盘的时候每一个map最终会产生
reduce数量个数的中间结果，如果map数量特别多，就会造成临时文件很多，而且在reduce拉取
数据的时候增加磁盘的IO。
   如何处理小文件？
   从源头解决，尽量在HDFS上不存储小文件，也就是数据上传HDFS的时候就合并小文件
   通过运行MR程序合并HDFS上已经存在的小文件
   MR计算的时候可以使用CombineTextInputFormat来降低MapTask并行度
   